Todos nós conhecemos a conhecida função VLOOKUP() que nos ajuda a combinar dados de diferentes tabelas. Porém, esta função tem uma desvantagem significativa - ela não pode combinar valores semelhantes, ou seja, se houver um erro na palavra, não haverá correspondência.
Para poder combinar valores aproximados, podemos criar nossa própria função. Vamos chamá-lo de FuzzyLookup().
Vamos imaginar que temos duas listas. Ambos têm aproximadamente os mesmos elementos, mas podem ser escritos de maneira um pouco diferente. A tarefa é encontrar para cada elemento da primeira lista o elemento mais semelhante da segunda lista, ou seja, implementar uma busca pelo texto maximamente semelhante mais próximo.
A grande questão, neste caso, é o que considerar como critério de “semelhança”. Apenas o número de caracteres correspondentes? É o número de partidas consecutivas? Devem ser considerados caracteres maiúsculas ou espaços? O que fazer com diferentes arranjos de palavras em uma frase? As opções são muitas e não existe uma solução única - para cada situação uma ou outra será melhor que outras.
No nosso caso, implementamos a opção mais simples - pesquisar pelo número máximo de correspondências de caracteres. Não é perfeito, mas funciona muito bem na maioria das situações.
Adicionar função FuzzyLookup , abra o menu Tools - Macros - Edit Macros... , selecione Módulo1 e copie o seguinte texto no módulo:
Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String
' moonexcel.com.ua
Dim Str As String
Dim CellArray As Variant
Dim StrArray As Variant
If IsMissing(SimThreshold) Then SimThreshold = 0
Str = LCase(LookupValue)
StrArray = Split(Str)
StrExt = UBound(StrArray)
For Each Cell In SrcTable
CellArray = Split(LCase(Cell))
CellExt = UBound(CellArray)
CellRate = 0
' Verificamos cada palavra na frase de pesquisa
For x = 0 To StrExt
StrWord = StrArray(x)
If Len(StrWord) = 0 Then GoTo continue_x
MaxStrWordRate = 0
' Verificamos cada palavra na próxima célula da tabela de valores original
For i = 0 To CellExt
CellWord = CellArray(i)
If Len(CellWord) = 0 Then GoTo continue_i
FindCharNum = OccurrenceNum(StrWord, CellWord)
StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))
If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate
continue_i:
Next i
CellRate = CellRate + MaxStrWordRate
continue_x:
Next x
' Mantemos a melhor combinação
If CellRate > MaxCellRate Then
MaxCellRate = CellRate
BestCell = Cell
FindCharNum = OccurrenceNum(Str, Cell)
SimRate = FindCharNum / Max(Len(Str),Len(Cell))
End If
Next Cell
IF SimRate >= SimThreshold Then
IF SimThreshold = -1 Then
ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"
ElseIf SimThreshold = -2 Then
ReturnValue = Format(SimRate, "0.00")
Else
ReturnValue = BestCell
End If
Else
ReturnValue = ""
End If
FuzzyLOOKUP = ReturnValue
End Function
Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String)
For i = 1 To Len(SourceString)
' Estamos procurando a ocorrência de cada símbolo
Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)
' Aumentamos o contador de coincidências
If Position > 0 Then
Count = Count + 1
' Remova o símbolo encontrado
TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)
End If
Next i
OccurrenceNum = Count
End Function
Function Max(ByVal value1 As Variant, ByVal value2 As Variant)
If value1 > value2 Then
Result = value1
Else
Result = value2
End If
Max = Result
End Function
A seguir, feche Macro Editor e volte para a planilha LibreOffice Calc - agora você pode usar nosso novo recurso FuzzyLookup() .
Você também pode usar o recurso FUZZYLOOKUP() instalando a extensão gratuita YouLibreCalc.oxt ou sua versão completa YLC_Utilities.oxt .
Depois disso, esta função estará disponível em todos os arquivos que serão abertos em LibreOffice Calc.